package com.colin.app.activity.view.fragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;

import com.colin.app.R;
import com.colin.app.activity.view.ViewContract;
import com.colin.app.activity.view.ViewPresenterImpl;
import com.colin.app.app.AppActivity;
import com.colin.app.bean.DemoBean;
import com.colin.app.fragment.test.TestFragment;
import com.colin.library.help.LogHelp;
import com.colin.library.help.ToastHelp;

public class MyFragmentActivity extends AppActivity implements ViewContract.ViewView,TestFragment.OnFragmentBackListener{
//    Fragmeng优点
//    Fragment可以使你能够将activity分离成多个可重用的组件，每个都有它自己的生命周期和UI。
//    Fragment可以轻松得创建动态灵活的UI设计，可以适应于不同的屏幕尺寸。从手机到平板电脑。
//    Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
//    Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
//    Fragment 解决Activity间的切换不流畅，轻量切换。
//    Fragment 替代TabActivity做导航，性能更好。
//    Fragment 在4.2.版本中新增嵌套fragmeng使用方法，能够生成更好的界面效果。
//    Fragment做局部内容更新更方便，原来为了到达这一点要把多个布局放到一个activity里面，现在可以用多Fragment来代替，只有在需要的时候才加载Fragment，提高性能


//    add()、replace()、remove()使用方法示例


//    有关回滚——FragmentTransaction
//    1、FragmentTransaction事务回滚使用方法：
//    上部分，我们讲了有关添加、删除Fragment的操作，想将上一次commit的操作返回时，要怎么做呢。这就需要FragmentTransaction的回滚功能了。
//    要使用回滚功能，只需要要使用下面两个代码：
//    在transaction.commit()之前，使用addToBackStack()将其添加到回退栈中。


    private ViewContract.ViewPresenter mViewPresenter = null;
    private TestFragment fragment_find_tag_xml;
    private TestFragment showFragment;

    @Override
    protected void onDestroy() {
        if (null != mViewPresenter) {
            mViewPresenter.destroy();
            mViewPresenter = null;
        }
        super.onDestroy();
    }

    @Override
    public void initPresenter() {
        DemoBean demoBean = getIntent().getExtras().getParcelable("clazz");
        mViewPresenter = new ViewPresenterImpl(this, this, demoBean);
    }


    @Override
    public int initViewLayoutID() {
        return R.layout.activity_my_fragment;
    }

    @Override
    public void initView() {
//        FragmentManager.findFragmentById();  //根据ID来找到对应的Fragment实例，主要用在静态添加fragment的布局中，因为静态添加的fragment才会有ID
//        FragmentManager.findFragmentByTag();//根据TAG找到对应的Fragment实例，主要用于在动态添加的fragment中，根据TAG来找到fragment实例
//        FragmentManager.getFragments();//获取所有被ADD进Activity中的Fragment
        this.fragment_find_tag_xml = (TestFragment) this.getSupportFragmentManager().findFragmentById(R.id.fragment_find_tag_xml);
        this.fragment_find_tag_xml.setText("静态添加Fragment");
//        AddFragment("Fragment-->>0");
    }

    @Override
    public void initData() {
        mViewPresenter.setData();
    }

//    @Override
//    public void onBackPressed() {
//
//        if (showFragment != null && !showFragment.onBackPressed()) {
//            getSupportFragmentManager().popBackStack();
//        }else {
//            super.onBackPressed();
//        }
//
//
//    }

    public void addFragment0(View view) {
        AddFragment("Fragment-->>0");

    }

    public void addFragment1(View view) {
        AddFragment("Fragment-->>1");

    }

    public void addFragment2(View view) {
        AddFragment("Fragment-->>2");

    }

    public void addFragment3(View view) {
        AddFragment("Fragment-->>3");

    }

    public void removeFragment1(View view) {
        removeFragment("Fragment-->>1");
    }


    public void replaceFragment0(View view) {
        replaceFragment("Fragment-->>0");
    }

    public void popBackStack(View view) {
        fragmentPopBackStack();
    }

    public void popBackStackToFragment1Flag0(View view) {
        fragmentPopBackStack("Fragment-->>1", 0);
    }

    public void popBackStackToFragment1Flag1(View view) {
        fragmentPopBackStack("Fragment-->>1", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }


    //    1.获取到FragmentManager，在V4包中通过getSupportFragmentManager，在系统中原生的Fragment是通过getFragmentManager获得的。
//    2.开启一个事务，通过调用beginTransaction方法开启。
//    3.向容器内加入Fragment，一般使用add或者replace方法实现，需要传入容器的id和Fragment的实例。
//    4.提交事务，调用commit方法提交。
    private void AddFragment(String title) {
        //获取Fragment管理
        FragmentManager manager = getSupportFragmentManager();
        //初始化事务
        FragmentTransaction transaction = manager.beginTransaction();
        //初始化Fragment
        Fragment fragment = TestFragment.newInstance(title);
        //将一个fragment实例添加到Activity的最上层
        //add(int containerViewId, Fragment fragment, String tag);
        //将一个fragment实例从Activity的fragment队列中删除
        //remove(Fragment fragment);
        //替换containerViewId中的fragment实例，注意，它首先把containerViewId中所有fragment删除，然后再add进去当前的fragment
        //replace(int containerViewId, Fragment fragment);
        //添加Fragment
        transaction.add(R.id.frame_fragment_show, fragment, title);
        //添加动画效果
        transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_right, R.anim.slide_out_right);
        //回退站
        transaction.addToBackStack(title);
        //事务提交
        transaction.commit();
    }

    /**
     * 只能移除栈顶上的Fragment
     *
     * @param title
     */
    private void removeFragment(String title) {
        FragmentManager manager = getSupportFragmentManager();
        //findFragmentByTag()动态获取
        Fragment fragment = manager.findFragmentByTag(title);
        if (null != fragment) {
            LogHelp.d("移除的Fragment==" + fragment.getTag());
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.remove(fragment);
            //添加动画效果
            transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_right, R.anim.slide_out_right);
            transaction.commit();
        }

    }

    private void replaceFragment(String title) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment fragment = TestFragment.newInstance(title);
        //将一个fragment实例添加到Activity的最上层
        //add(int containerViewId, Fragment fragment, String tag);
        //将一个fragment实例从Activity的fragment队列中删除
        //remove(Fragment fragment);
        //替换containerViewId中的fragment实例，注意，它首先把containerViewId中所有fragment删除，然后再add进去当前的fragment
        //replace(int containerViewId, Fragment fragment);
        transaction.add(R.id.frame_fragment_show, fragment, title);
        //添加动画效果
        transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_right, R.anim.slide_out_right);
        transaction.commit();
    }

    /**
     * 回退栈处理
     */
    private void fragmentPopBackStack() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.popBackStack();
    }

    /**
     * 回退栈处理
     *
     * @param title
     * @param popBackStackInclusive 0 回到当前Tag Fragment界面  1 把当前Tag Fragment界面也弹出
     */
    private void fragmentPopBackStack(String title, int popBackStackInclusive) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.popBackStackImmediate(title, popBackStackInclusive);
    }

    @Override
    public void onFragmentClick(String title, boolean isBack) {
        ToastHelp.showShort(title + "-->>" + String.valueOf(isBack));
    }

    @Override
    public void setSelectedFragment(TestFragment testFragment) {
        this.showFragment = testFragment;
    }

}
